use std::{error::Error, fs::File, io::{self, Read}};

fn mathc_err() {
    let f = File::open("hello.txt");
    let f = match f {
        // 将文件句柄重新绑定至变量f
        Ok(file) => file,
        Err(error) => panic!("{:?}", error)
    };
}

fn panic_test() {
    let v = vec![1, 2, 3];
    // RUST_BACKTRACE=1 cargo run
    // 非 --release模式下, 带有调试符号
    v[100];
}

fn unwrap_test() {
    // unwarp在Ok时返回内部的值，Err时调用panic宏
    let f1 = File::open("hello.txt").unwrap();
}

fn read_file() -> Result<String, io::Error> {
    // 错误传播, 在Result后的？, 相当于match匹配error后返回
    // Err(err) => return Err(err),
    // 函数的返回值也必须是Result
    let mut f = File::open("hello.txt")?;
    
    let mut s = String::new();
    match f.read_to_string(&mut s) {
        Ok(_) => Ok(s),
        Err(e) => Err(e),
    }
}


fn main() -> Result<(), Box<dyn Error>> {
    // main函数也可返回Result，可用？
    let f = File::open("")?;
    Ok(())
}